package fr.charlott.core.repository.model;

import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;
import javax.validation.Valid;
import javax.validation.constraints.Past;

@Entity
@Table(name="Personne", uniqueConstraints = {@UniqueConstraint(columnNames={"nom", "prenom", "dateDeNaissance"})})
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="typePersonne", discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue("Personne")
public class Personne {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	private String nom;

	private String prenom;

	@Temporal(TemporalType.DATE)
	private Date dateDeNaissance;

	// Adresse
	@Embedded
	@OneToOne(cascade = CascadeType.ALL)
	@JoinColumn(name="adresse_id", referencedColumnName="id")
	@Valid
	private Adresse adresse;
	
	// Tailles
	private TailleHaut tailleHaut;

	private TailleBas tailleBas;
	
	@ManyToMany(fetch=FetchType.EAGER, cascade={CascadeType.PERSIST, CascadeType.MERGE})
	@JoinTable(	name="Personne_Produit",
				joinColumns=@JoinColumn(name="Personne_Id"),
				inverseJoinColumns=@JoinColumn(name="Produit_Id"))
	private List<Produit> produits;
	
	private String achats;
	
	private String commentaires;

	private String preferences;
	
	@Past
	@Temporal(TemporalType.DATE)
	private Date derniereVisite;
	
	// constructeurs

	public Personne() {
		super();
		this.adresse = new Adresse();
	}

	// setters - getters
	/**
	 * @return the adresse
	 */
	public Adresse getAdresse() {
		return adresse;
	}

	/**
	 * @param adresse
	 *            the adresse to set
	 */
	public void setAdresse(Adresse adresse) {
		this.adresse = adresse;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNom() {
		return nom;
	}

	public void setNom(String nom) {
		this.nom = nom;
	}

	public String getPrenom() {
		return prenom;
	}

	public void setPrenom(String prenom) {
		this.prenom = prenom;
	}

	public Date getDateDeNaissance() {
		return dateDeNaissance;
	}

	public void setDateDeNaissance(Date dateDeNaissance) {
		this.dateDeNaissance = dateDeNaissance;
	}

	public TailleHaut getTailleHaut() {
		return tailleHaut;
	}

	public void setTailleHaut(TailleHaut tailleHaut) {
		this.tailleHaut = tailleHaut;
	}
	
	public TailleBas getTailleBas() {
		return tailleBas;
	}
	
	public void setTailleBas(TailleBas tailleBas) {
		this.tailleBas = tailleBas;
	}

	public List<Produit> getProduits() {
		return produits;
	}

	public void setProduits(List<Produit> produits) {
		this.produits = produits;
	}

	public String getCommentaires() {
		return commentaires;
	}

	public void setCommentaires(String commentaires) {
		this.commentaires = commentaires;
	}

	public Date getDerniereVisite() {
		return derniereVisite;
	}

	public void setDerniereVisite(Date derniereVisite) {
		this.derniereVisite = derniereVisite;
	}

	public String getPreferences() {
		return preferences;
	}

	public void setPreferences(String preferences) {
		this.preferences = preferences;
	}

	public String getAchats() {
		return achats;
	}

	public void setAchats(String achats) {
		this.achats = achats;
	}
	
}
